"""
列表的注意事项和使用细节
"""
# 1.如果需要一个空列表,可以通过[]或者list()方式定义
list1 = []
list2 = list()

# print(list1 , type(list1))
# print(list2 , type(list2))

# 2。列表的元素可以有多个,而且数据类型是没有限制的,允许有重复元素,并且是有序的
list3 = [100, "jack", 4.5, True]
print(list3)
# 嵌套列表
list4 = [100, "tom", ["天龙八部", "笑傲江湖", 300]]
print(f"list4={list4}")

# 3.列表的索引/下标是从0开始的

# 4.列表的索引必须在指定的范围内使用,否则就会报错 IndexError:list index out of range
# 比如list1=[1 ,2 , '韩顺平教育'] 有效下标为 0-2
list5 = [1, 2, '韩顺平教育']
# print(list5[3])

# 5.函数的索引也可以从尾部开始,最后一个元素的索引为-1 ， 往前一位为-2,以此类推
# print(list5[-1])

# 6.通过 列表[索引]=新值 对数据进行更新,使用列表.append(值)方法来添加元素,使用del语句来删除列表的元素
# 索引 ， 注意不能超出有效索引的范围
list_a = ["天龙八部", "笑傲江湖"]
print("list_a", list_a)
list_a[0] = "雪山飞狐"
print("list_a", list_a)
list_a.append("倚天屠龙")
print("list_a", list_a)
del list_a[1]
print("list_a", list_a)

# 7.列表是可变序列(要注意其使用特点)
# 列表的元素是可以修改的,修改后,列表变量指向的地址不变,只是数据内容发生了变化
list_b = [1, 2.1, '韩顺平教育']
print(f"list_b地址是{id(list_b)} || {list_b[2]} {id(list_b[2])}")
list_b[2] = 'Python'
print(f"list_b地址是{id(list_b)} || {list_b[2]} {id(list_b[2])}")
# 列表其实指向的是同一个地址，当里面的元素发生变化的时候 都会发生变化
list_c = list_b
list_c[0] = 500
print("list_b", list_b)
print("list_c", list_c)


# 扩展一下，看看列表在函数传参的时候的特点
def f1(l):
    l[0] = 100
    print("l的id , ", id(l))


list10 = [1, 2.1, 200]
print("list10的id :", id(list10))
f1(list10)
print("list10:", list10)

# 演示列表常用操作
list_d = [100, 200, 300, 400, 600]
print("list_d列表的元素的个数:", len(list_d))
print("list_d列表的元素的最大元素:", max(list_d))
print("list_d列表的元素的最小元素:", min(list_d))

# 请在list_d的列表后,添加900
# list_d.append(900) 在列表后面添加新元素
list_d.append(900)
print("list_d", list_d)

print("100出现的次数是 :", list_d.count(100))

list_e = [1, 2, 3]
#将list_e追加到list_d 说白了  这些都是内置方法  不过就是由别的程序员写的方法
#里面怎么实现 你不需要知道  他就是轮子  你会熟悉使用就行了  自己也会写  只要有强大的基础 就没问题
list_d.extend(list_e)
print("list_d" , list_d)

#list.index(obj):从列表中找出某个值第一个匹配项的索引位置
#如果找不到 会报错  ValueError: 3000 is not in list

print("300第一次出现在序列的索引是:" , list_d.index(300))

#翻转list_d , list.reverse()
list_d.reverse()
print("list_d" , list_d)

list_d.insert(1 , 666)
#list.insert(index , obj) : 将对象插入列表的指定index位置 ， 其他的索引往后推
print("list_d" , list_d)